﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using CroslandSAP.Proxy;
using System.Data;
using CROSLAND.BL.BE;

namespace CROSLAND.DL.DALC.SAPC
{
    public class ImpresionDALC : IImpresionDALC
    {
        public static ImpresionDALC Instance()
        {
            if (_instance == null)
            {
                lock (typeof(ImpresionDALC))
                {
                    if (_instance == null)
                    {
                        _instance = new ImpresionDALC();
                    }
                }
            }
            return _instance;
        }
        private ImpresionDALC() { }
        private static volatile ImpresionDALC _instance = null;

        #region Ticket

        public List<TicketBE> obtenerImpresionTicket(string pNroPedido, string pDocumento)
        {
            ImpresionProxy proxy = new ImpresionProxy();
            proxy.Connection = DALC.getConnection;
            if (!proxy.Connection.IsOpen) { proxy.Connection.Open(); }

            ZSVMC_CAB_FRM_TICKET objCab = new ZSVMC_CAB_FRM_TICKET();
            ZSVMC_PIE_FRM_TICKET objPie = new ZSVMC_PIE_FRM_TICKET();
            ZSVMC_DET_FRM_TICKETTable tblDet = new ZSVMC_DET_FRM_TICKETTable();

            proxy.Zvmc_Sd_028(pNroPedido.PadLeft(10, '0'), out objCab, out  objPie, ref tblDet);
            SAP.Connector.SAPConnectionPool.ReturnConnection(proxy.Connection);
            proxy.Connection = null;
            /* Manejando el retorno */
            //DataTable dt = tblDet.ToADODataTable();
            List<TicketBE> lstT = new List<TicketBE>();
            foreach (ZSVMC_DET_FRM_TICKET item in tblDet)
            {
                TicketBE obj = new TicketBE();
                obj.DesSociedad = objCab.Dbukrs.Trim();
                obj.DireccionSociedad = objCab.Street.Trim() + ' ' + objCab.House_Num1.Trim() + ' ' + objCab.Post_Code1.Trim() + ' ' + objCab.Direc.Trim() + ' ' + objCab.City1.Trim() + ' ' + objCab.City2.Trim();
                obj.RucSociedad = objCab.Ruc.Trim();
                obj.NumDocumento = objCab.Vbeln.Trim();
                obj.SubTotal = objPie.Neto_Total;
                obj.Igv = objPie.Total_Igv;
                obj.MontoTotal = objPie.Total_Doc;
                obj.NomCliente = objPie.Name1.Trim() + " " + objPie.Name2.Trim();
                string[] tipnum = objPie.Nif.Split(new char[] { ':' });
                if (tipnum != null)
                {
                    obj.TipoDocumento = tipnum[0].ToString().Trim() == "" ? "" : tipnum[0].Trim();
                    obj.NumDocumento = tipnum[1].ToString().Trim() == "" ? "" : tipnum[1].Trim();
                }
                obj.MontoLetras = objPie.Monto_L.Trim();
                obj.NroSerie = objPie.Nroserie.Trim();
                obj.Fecha = ParametroDALC.dateSapToNet(objPie.Fecha.Trim()).Day.ToString() + '/' +
                            ParametroDALC.dateSapToNet(objPie.Fecha.Trim()).Month.ToString() + '/' +
                            ParametroDALC.dateSapToNet(objPie.Fecha.Trim()).Year.ToString();

                obj.Hora = objPie.Hora.Trim().Substring(0, 2) + ":" + objPie.Hora.Trim().Substring(2, 2) + ":" + objPie.Hora.Trim().Substring(4, 2);
                obj.NroCaja = objPie.Nrocaja.Trim();
                obj.CodMaterial = item.Matnr.TrimStart('0');
                obj.Cantidad = item.Kwmeng;
                obj.DesMaterial = item.Arktx.Trim();
                obj.ImpNetoTotal = item.Netwr;

                obj.NroTicket = pDocumento;
                if (objPie.Med_Pago.Trim() != "")
                {
                    obj.FormaPago = objPie.Med_Pago.ToString().Substring(0, objPie.Med_Pago.ToString().Length - 1);
                }
                else
                {
                    obj.FormaPago = "";
                }

                obj.DesTicket = "";

                obj.Tipodoc = "Ticket Boleta";
                if (obj.TipoDocumento.Equals("RUC"))
                    obj.Tipodoc = "Ticket Factura";

                lstT.Add(obj);
            }

            return lstT;
        }

        #endregion

        #region Cotizacion

        public List<CotizacionBE> obtenerReporteCotizacion(string pNroCotizacion)
        {
            ImpresionProxy proxy = new ImpresionProxy();
            proxy.Connection = DALC.getConnection;
            if (!proxy.Connection.IsOpen) { proxy.Connection.Open(); }

            ZSVMC_CAB_FRM_COTIZA objCab = new ZSVMC_CAB_FRM_COTIZA();
            ZSVMC_PIE_FRM_COTIZA objPie = new ZSVMC_PIE_FRM_COTIZA();
            ZSVMC_DET_FRM_COTIZATable tblDet = new ZSVMC_DET_FRM_COTIZATable();

            proxy.Zvmc_Sd_027(pNroCotizacion.PadLeft(10, '0'), out objCab, out  objPie, ref tblDet);
            SAP.Connector.SAPConnectionPool.ReturnConnection(proxy.Connection);
            proxy.Connection = null;

            List<CotizacionBE> lst = new List<CotizacionBE>();
            foreach (ZSVMC_DET_FRM_COTIZA item in tblDet)
            {
                CotizacionBE obj = new CotizacionBE();
                obj.CodCliente = objCab.Kunnr.Trim();
                obj.NomCliente = objCab.Name1.Trim() + " " + objCab.Name2.Trim();
                obj.FecDocumento = ParametroDALC.dateSapToNet(objCab.Fdocu.Trim());
                obj.NroCotizacion = objCab.Nrodoc.Trim();
                obj.DescMoneda = objCab.Dwaers.Trim();
                obj.DescUsuario = objCab.Uname.Trim();
                obj.FecCreacion = ParametroDALC.dateSapToNet(objCab.Fcrea.Trim());
                obj.HoraCreacion = objCab.Hcrea.Trim().Substring(0, 2) + ":" + objCab.Hcrea.Trim().Substring(2, 2);
                obj.Sociedad = objCab.Dbkbur.Trim();
                obj.OficinaVenta = objCab.Dvkbur.Trim();
                obj.NetoTotal = objPie.Neto_Total;
                obj.Igv = objPie.Total_Igv;
                obj.PrecioTotal = objPie.Total_Doc;
                string hora = objCab.Hcrea.Trim();
                string horaNuevo = hora.Substring(0, 2) + ":" + hora.Substring(2, 2) + ":" + hora.Substring(4, 2);
                obj.HoraCreacion = horaNuevo;
                obj.CodMaterial = item.Matnr.Trim();
                obj.DescMaterial = item.Arktx.Trim();
                obj.Cantidad = item.Kwmeng;
                obj.PrecioLista = item.Kzwi4;
                obj.Unidad = item.Vrkme.Trim();
                obj.Descuento = item.Kzwi2;
                obj.Recargo = item.Kzwi3;
                obj.ValorNetoUni = item.Netwr / item.Kwmeng;
                obj.NetoPosicion = item.Netwr;

                lst.Add(obj);
            }

            return lst;
        }

        #endregion

        #region Oferta Simple

        public List<OfertaSimpleBE> obtenerReporteOfertaSimple(string pOferta)
        {
            ImpresionProxy proxy = new ImpresionProxy();
            proxy.Connection = DALC.getConnection;
            if (!proxy.Connection.IsOpen) { proxy.Connection.Open(); }

            ZSVMC_CAB_FRM_OF_SIMPLE objCab = new ZSVMC_CAB_FRM_OF_SIMPLE();
            ZSVMC_PIE_FRM_OF_SIMPLE objPie = new ZSVMC_PIE_FRM_OF_SIMPLE();
            ZSVMC_DET_FRM_OF_SIMPLETable tblDet = new ZSVMC_DET_FRM_OF_SIMPLETable();

            proxy.Zvmc_Sd_034(pOferta.PadLeft(10, '0'), out objCab, out  objPie, ref tblDet);
            SAP.Connector.SAPConnectionPool.ReturnConnection(proxy.Connection);
            proxy.Connection = null;

            List<OfertaSimpleBE> lst = new List<OfertaSimpleBE>();
            foreach (ZSVMC_DET_FRM_OF_SIMPLE item in tblDet)
            {
                OfertaSimpleBE obj = new OfertaSimpleBE();
                //Cabecera
                obj.FechaRegistro = ParametroDALC.dateSapToNet(objCab.Audat.Trim());
                obj.NroCotizacion = objCab.Vbeln.Trim();
                obj.DesRazonSocial = objCab.Name1_Ag.Trim() + " " + objCab.Name2_Ag.Trim();
                obj.Ruc = objCab.Stcd1.Trim();
                obj.DesDireccion = objCab.Street.Trim();
                obj.DesDistrito = objCab.City2.Trim();
                obj.DesProvincia = objCab.City1.Trim();
                obj.DesDepartamento = objCab.Bezei.Trim();
                obj.DesPais = objCab.Landx.Trim();
                obj.NumTelefono = objCab.Telf1.Trim();
                obj.DesAtencion = objCab.Name1_Rg.Trim() + " " + objCab.Name2_Rg.Trim();
                obj.DesReferencia = objCab.Referencia.Trim();
                obj.DesSociedad = objCab.Empresa.Trim();
                //Detalle
                obj.CodModelo = item.Matnr.Trim();
                obj.ModeloEquipo = item.Arktx.Trim();
                obj.DesColor = item.Bstkd_E.Trim();
                obj.DesMarca = item.Marca.Trim();
                obj.Cantidad = item.Kwmeng;
                obj.PrecioUniLista = item.Kzwi4;
                obj.Descuento = item.Kzwi2;
                obj.Recargo = item.Kzwi3;
                obj.ValorVentaUni = item.Vta_Unit;
                obj.ValorVentaTot = item.Netwr;
                //Pie
                obj.ValorVenta = objPie.Valor_Venta;
                obj.Isc = Convert.ToDecimal(objPie.Isc);
                obj.Igv = Convert.ToDecimal(objPie.Igv);
                obj.PrecioTotal = objPie.Precio_Total;
                obj.MontoLetras = objPie.Precio_Letras.Trim();
                obj.DesObservaciones = objPie.Observaciones.Trim();
                obj.DesFormaPago = objPie.Forma_Pago.Trim();
                obj.DesTiempoValidez = objPie.Validez_Oferta.ToString();
                obj.DesTiempoEntrega = objPie.Tiempo_Entrega.ToString() + " días";
                obj.DesTiempoGarantia = objPie.Tiempo_Garantia.ToString() + " días";
                obj.DesLugarEntrega = objPie.Lugar_Entrega.ToString();
                obj.DesTipoCredito = objPie.Tipo_Credito.ToString();
                obj.TipoCambio = objPie.Tipo_Cambio;
                obj.DesGlosa = objPie.Otros.ToString();
                obj.DesVendedor = objPie.Nombre_Vendedor.Trim();
                obj.DesEmail = objPie.Email.Trim();

                lst.Add(obj);
            }

            return lst;
        }

        #endregion

        #region Oferta Tecnica

        public List<OfertaTecnicaBE> obtenerReporteOfertaTecnica(string pOferta)
        {
            ImpresionProxy proxy = new ImpresionProxy();
            proxy.Connection = DALC.getConnection;
            if (!proxy.Connection.IsOpen) { proxy.Connection.Open(); }

            ZSVMC_CAB_FRM_OF_TECNICA objCab = new ZSVMC_CAB_FRM_OF_TECNICA();
            ZSVMC_PIE_FRM_TECNICO objPie = new ZSVMC_PIE_FRM_TECNICO();
            ZSVMC_DET_FRM_OF_TECNICATable tblDet = new ZSVMC_DET_FRM_OF_TECNICATable();

            proxy.Zvmc_Sd_035(pOferta.PadLeft(10, '0'), out objCab, out  objPie, ref tblDet);
            SAP.Connector.SAPConnectionPool.ReturnConnection(proxy.Connection);
            proxy.Connection = null;

            List<OfertaTecnicaBE> lst = new List<OfertaTecnicaBE>();
            foreach (ZSVMC_DET_FRM_OF_TECNICA item in tblDet)
            {
                OfertaTecnicaBE obj = new OfertaTecnicaBE();
                //Cabecera 
                obj.FechaCarta = ParametroDALC.dateSapToNet(objCab.Audat.Trim());
                obj.NroCotizacion = objCab.Vbeln.Trim();
                obj.DesRazonSocial = objCab.Name1.Trim() + " " + objCab.Name2.Trim();
                obj.DesDireccion = objCab.Street.Trim();
                obj.DesDistrito = objCab.City2.Trim();
                obj.DesProvincia = objCab.City1.Trim();
                obj.DesDepartamento = objCab.Bezei.Trim();
                obj.DesPais = objCab.Landx.Trim();
                obj.DesAtencion = objCab.Name1.Trim() + " " + objCab.Name2.Trim();
                obj.DesReferencia = objCab.Referencia.Trim();
                obj.NumTelefono = objCab.Telf1.Trim();
                obj.DesSociedad = objCab.Empresa.Trim();
                //Detalle
                obj.NroPosicion = item.Posnr.Trim();
                obj.CodArticulo = item.Matnr.Trim();
                obj.DesArticulo = item.Arktx.Trim();
                obj.DesUnidadMedida = item.Vrkme.Trim();
                obj.Cantidad = item.Kwmeng;
                obj.PrecioUnitario = item.Netpr;
                obj.ValorVenta = item.Kzwi4;
                obj.Descuento = item.Kzwi2;
                obj.CargoAdicional = item.Kzwi3;
                obj.SubTotal = item.Vta_Total;
                obj.DesMarca = item.Marca.Trim();
                obj.DesModeloMotor = item.Zc01_Modelo_Motor.Trim();
                obj.TipoCarroceria = item.Zc06_Tipo_Carroceria.Trim();
                obj.DesMarcaMotor = item.Zc02_Marca_Motor.Trim();
                obj.DesColor = item.Zc03_Color.Trim();
                obj.AnioFabricacion = item.Zc07_Anio_Fabricacion.Trim();
                obj.Cilindros = item.Zc08_Cilindros.Trim();
                obj.AnioModelo = item.Zc09_Anio_Modelo.Trim();
                obj.FormulaRodante = item.Zc10_Formula_Rodante.Trim();
                obj.Transmision = item.Zc11_Transmision.Trim();
                obj.PotenciaContinua = item.Zc12_Potencia_Continua.Trim();
                obj.PotenciaEmergente = item.Zc13_Potencia_Emergencia.Trim();
                obj.Version = item.Zc14_Version.Trim();
                obj.Cilindrada = item.Zc15_Cilindrada.Trim();
                obj.NroRuedas = item.Zc16_Numero_Ruedas.Trim();
                obj.Ruedas = item.Zc16_Numero_Ruedas.Trim();
                obj.NroAsientos = item.Zc17_Numero_Asientos.Trim();
                obj.Longitud = item.Zc18_Longitud.Trim();
                obj.Ejes = item.Zc20_Ejes.Trim();
                obj.Ancho = item.Zc21_Ancho.Trim();
                obj.Altura = item.Zc22_Altura.Trim();
                obj.Combustible = item.Zc23_Combustible.Trim();
                obj.Peso = Convert.ToDecimal(item.Zc24_Peso_Bruto);
                obj.PesoBruto = item.Zc24_Peso_Bruto.Trim();
                obj.PesoNeto = item.Zc25_Peso_Neto.Trim();
                obj.ModeloAlternador = item.Zc27_Modelo_Alternador.Trim();
                obj.Regulador = item.Zc28_Regulador.Trim();
                obj.VoltajeAlternador = item.Zc29_Voltaje_Alternador.Trim();
                obj.Categoria = item.Zc30_Categoria.Trim();
                obj.PotenciaMotor = item.Zc32_Potencia_Motor.Trim();
                obj.CargaUtil = item.Zc33_Carga_Util.Trim();
                obj.NroPasajeros = item.Zc34_Numero_Pasajeros;
                obj.DesEquipo = item.Zmodelo.Trim();
                //Pie
                obj.DesObservaciones = objPie.Observaciones.Trim();
                obj.MontoLetras = objPie.Precio_Letras.Trim();
                obj.DesFormaPago = objPie.Forma_Pago.Trim();
                obj.DesTiempoValidez = objPie.Validez_Oferta.ToString();
                obj.DesTiempoEntrega = objPie.Tiempo_Entrega.ToString();
                obj.DesLugarEntrega = objPie.Lugar_Entrega.ToString();
                obj.DesTiempoGarantia = objPie.Tiempo_Garantia.ToString();
                obj.DesVendedor = objPie.Nombre_Vendedor.Trim();
                obj.DesVendedorAsignado = objPie.Nombre_Vendedor.Trim();
                obj.DesEmail = objPie.Email.Trim();
                obj.NumTelefono = objPie.Telefono.Trim();
                obj.PrecioVenta = objPie.Valor_Venta;
                obj.Isc = objPie.Isc;
                obj.Igv = objPie.Igv;
                obj.PrecioTotal = objPie.Precio_Total;
                obj.TipoCambio = objPie.Tipo_Cambio;
                lst.Add(obj);
            }

            return lst;
        }

        #endregion

        #region Anticipo

        public List<AnticipoBE> obtenerImpresionAnticipo(string pNroFactura, string folio)
        {
            ImpresionProxy proxy = new ImpresionProxy();
            proxy.Connection = DALC.getConnection;
            if (!proxy.Connection.IsOpen) { proxy.Connection.Open(); }

            ZSVMS_IMPANTTable tblCab = new ZSVMS_IMPANTTable();
            ZSVMS_DETPOSTable tblDet = new ZSVMS_DETPOSTable();
            DYCBOXTable tblRet = new DYCBOXTable();

            proxy.Zvmc_Sd_043(pNroFactura.PadLeft(10, '0'), ref tblRet, ref tblCab, ref tblDet);
            SAP.Connector.SAPConnectionPool.ReturnConnection(proxy.Connection);
            proxy.Connection = null;

            List<AnticipoBE> lst = new List<AnticipoBE>();
            //Detalle
            foreach (ZSVMS_DETPOS itm in tblDet)
            {
                AnticipoBE obj = new AnticipoBE();
                obj.NroFactura = tblCab[0].Vbeln;
                obj.NroPedido = tblCab[0].Belnr;
                obj.Descuento = Convert.ToDecimal("0.00");
                obj.Anticipo = tblCab[0].Anti;
                obj.Neto = tblCab[0].Netwr;
                obj.Igv = tblCab[0].Mwsbk;
                obj.PrecioTotal = tblCab[0].Total;
                obj.MontoLetras = tblCab[0].Son;
                obj.RazonSocial = tblCab[0].Rsocial;
                obj.Direccion = tblCab[0].Direc;
                obj.Distrito = tblCab[0].Distrito;
                obj.Provincia = tblCab[0].Provincia;
                obj.Departamento = tblCab[0].Dpto;
                obj.Pais = tblCab[0].Pais;
                obj.Ruc = tblCab[0].Ruc;
                obj.CodMaterial = itm.Matnr;
                obj.DesMaterial = itm.Maktx;
                obj.UnidadMedida = itm.Vrkme;
                obj.Cantidad = itm.Kwmeng;
                obj.PrecioLista = itm.Kzwi4;
                obj.ValorVtaTot = itm.Kzwi1;
                obj.Glosa = tblCab[0].Glosa;
                obj.GlosaPago = tblCab[0].Glosa2;
                obj.Descuento = itm.Dsto;
                obj.Anticipo = itm.Anticipo;
                obj.Recargo = itm.Recargo;
                obj.ValorVtaUni = itm.Valvtaunit;
                obj.FechaEmision = ParametroDALC.dateSapToNet(tblCab[0].Fkdat);
                obj.SimboloMoneda = tblCab[0].Waerk;
                obj.NroDocumento = tblCab[0].Folio;
                lst.Add(obj);
            }
            return lst;
        }

        #endregion
    }
}
